package com.dwork.base.mybatis.dao;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;

import org.mybatis.spring.support.SqlSessionDaoSupport;

import com.dwork.base.pagination.Page;
import com.dwork.base.pagination.Pagination;

/**
 * MyBatis基础Dao类，对通用的数据操作进行封装
 * 
 * @author DaiBiao
 * 
 * @param <T>
 * @param <ID>
 */
public class BaseDao<T, ID extends Serializable> extends SqlSessionDaoSupport {

	public static final String SQLNAME_SEPARATOR = ".";

	private String sqlNamespace = getDefaultSqlNamespace();

	@SuppressWarnings("unchecked")
	protected String getDefaultSqlNamespace() {
		Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass()
				.getGenericSuperclass()).getActualTypeArguments()[0];
		String nameSpace = entityClass.getName();
		return nameSpace;
	}

	protected String getSqlName(String sqlName) {
		return sqlNamespace + SQLNAME_SEPARATOR + sqlName;
	}

	/**
	 * 保存对象
	 * 
	 * @param ob
	 * @return
	 * @throws EntityValidationException
	 */
	public Integer save(T obj) {
		return this.getSqlSession().insert(
				getSqlName(SqlName.SQL_SAVE.getSqlName()), obj);
	}
	/**
	 * 批量保存对象
	 * @param objs
	 * @return
	 * @throws KFServiceException
	 */
	public Integer batchSave(List<T> objs){
		return this.getSqlSession().insert(
				getSqlName(SqlName.SQL_BATCHSAVE.getSqlName()), objs);
	}
	
	@SuppressWarnings("unchecked")
	public T findById(ID id) {
		return (T)(this.getSqlSession().selectOne(
				getSqlName(SqlName.SQL_FINDBYID.getSqlName()), id));
	}

	/**
	 * 更新对象
	 * 
	 * @param obj
	 * @throws EntityValidationException
	 */
	public void update(T obj){

		this.getSqlSession().update(
				getSqlName(SqlName.SQL_UPDATE.getSqlName()), obj);
	}
	/**
	 * 批量更新
	 * @param objs
	 * @throws KFServiceException
	 */
	public void batchUpdate(List<T> objs){
		this.getSqlSession().update(
				getSqlName(SqlName.SQL_BATCHUPDATE.getSqlName()), objs);
	}
	/**
	 * 批量删除对象
	 * @param ids
	 * @return
	 */
	public Integer deleteByIds(ID[] ids) {
		return this.getSqlSession().delete(
				getSqlName(SqlName.SQL_DELETEBYIDS.getSqlName()), ids);
	}
	/**
	 * 批量删除对象
	 * @param ids
	 * @return
	 */
	public Integer deleteByIds(List<ID> ids) {
		return this.getSqlSession().delete(
				getSqlName(SqlName.SQL_DELETEBYIDS.getSqlName()), ids);
	}
	
	/**
	 * 删除对象
	 * @param id
	 * @return
	 */
	public Integer deleteById(ID id) {
		return this.getSqlSession().delete(
				getSqlName(SqlName.SQL_DELETEBYID.getSqlName()), id);
	}

	/**
	 * 根据条件查询列表数据
	 * 
	 * @param param
	 *            查询条件
	 * @return 列表数据,如果查不到数据，则返回长度为0的ArrayList,而不是null
	 */
	public List<T> findByList(Map<String, Object> paramMap) {
		List<T> list = this.getSqlSession().selectList(
				getSqlName(SqlName.SQL_FINDBYLIST.getSqlName()), paramMap);
		return list;
	}

	/**
	 * 根据条件查询分页列表数据
	 * 
	 * @param param
	 *            查询条件
	 * @return 分页列表数据
	 */
	public Pagination<T> findByPage(Page page, Map<String, Object> paramMap) {
		paramMap.put("page", page);
		List<T> list = this.getSqlSession().selectList(
				getSqlName(SqlName.SQL_FINDBYPAGE.getSqlName()), paramMap);
		Pagination<T> pagination = new Pagination<T>();
		pagination.setData(list);
		pagination.setPage(page);
		return pagination;
	}
	
	/**
	 * 列出所有结果集
	 * @return
	 */
	public List<T> findAll() {
		List<T> list = this.getSqlSession().selectList(
				getSqlName(SqlName.SQL_FINDALL.getSqlName()));
		return list;
	}

	
}
